package com.arraylist;

import java.util.Arrays;

/**
 * 1.添加元素
 */
public class ArrayList {

    private Object[] elementDate;

    private int size;

    /**
     * 数组中实际存放元素的个数
     * @return
     */
    public int size(){
        return size;
    }

    /**
     * 设置数组默认长度为10
     */
    public ArrayList(){
        this.elementDate=new Object[10];
    }

    /**
     * 指定设置数组的长度
     * @param cap
     */
    public ArrayList(int cap){
       //判断cap是否合法
       if(cap<0)
           throw new RuntimeException("参数不合法,cap:"+cap);

       //实例化数组
       this.elementDate=new Object[cap];
    }

    /**
     * 添加元素
     * @param element
     */
    public void add(Object element){
        //扩容操作
         ensureCapacityInternal();
        //元素放入到数组中
        elementDate[size]=element;
        size++;
    }

    /**
     * 根据索引获取元素值
     * @param index
     * @return
     */
    public Object getIndex(int index){
       rankChange(index);
       return elementDate[index];
    }

    /**
     * 根据索引删除元素
     * @param index
     */
    public void remove(int index){
        rankChange(index);
        //获得删除索引以及索引之后的值
        for (int i=index;i<size-1;i++){
            elementDate[i]=elementDate[i+1];
        }
        //最后一个元素设置为默认值
        elementDate[size-1]=null;
        //更新size的值
        size--;
    }

    /**
     * 根据索引插入元素
     * @param index
     * @param element
     */
    public void add(int index,Object element){
       //判断索引是否合法
       if(index<0||index>size){
           throw new ArrayIndexOutOfBoundsException("索引异常"+index);
       }
       //判断数组是否需要扩容
       ensureCapacityInternal();

       //插入索引以及之后的元素往后挪动一位
        for(int i=size-1;i>=index;i--){

            elementDate[i+1]=elementDate[i];
        }
        //插入操作
        elementDate[index]=element;
        //更新size
        size++;
    }

    /**
     * 判断数组是否执行扩容操作
     */
    public void ensureCapacityInternal(){

        if(elementDate.length==size){
            Object[] newArr=new Object[elementDate.length*2+1];
            //原数组中的内容拷贝到新数组中
            for (int i=0;i<size;i++){
                newArr[i]=elementDate[i];
            }
          elementDate=newArr;
        }
    }

    /**
     * 检索索引是否合法[0,size-1]
     * @param index
     */
    public void rankChange(int index){
      if(index<0 || index>=size){
          throw  new IndexOutOfBoundsException("索引异常:"+index);
      }

    }



    @Override
    public String toString() {
        return "ArrayList{" +
                "elementDate=" + Arrays.toString(elementDate) +
                '}';
    }
}
